﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Test2.Model;
using System.Data.SqlClient;

namespace Test2.View
{
    public partial class NieuweFactuur : Form, iUpdatable
    {

        private iDatabaseRepository databaseRepository = Database.Instance.GetDatabase;
        private DataTable dtKlanten;
        private ToonOverzicht to;

        public NieuweFactuur(ToonOverzicht to)
        {
            this.to = to;
            InitializeComponent();
        }

        private void NieuweFactuur_Load(object sender, EventArgs e)
        {
            dtKlanten = new DataTable();
            updateKlanten();
        }

        private void loadDGVKlanten(string input)
        {
            if (input != null && input.Length > 0)
            {
                dtKlanten = databaseRepository.getKlantenVoornaamNaamFilter(input);
            }
            else
            {
                dtKlanten = databaseRepository.getKlantenVoornaamNaam();
            }
            BindingSource bs = new BindingSource();
            bs.DataSource = dtKlanten;
            dgvKlanten.DataSource = null;
            dgvKlanten.DataSource = bs;
            if (dgvKlanten.ColumnCount > 2)
            {
                dgvKlanten.Columns[0].Visible = false; // klantID verbergen
                dgvKlanten.Columns[1].HeaderText = "Voornaam";
                dgvKlanten.Columns[2].HeaderText = "Naam";
            }
            try
            {
                //klantennummer
                int nieuwFactuurnr = int.Parse(databaseRepository.getLaatsteFactuurnummer()) + 1;
                tbFactuurnummer.Text = nieuwFactuurnr + "";
            }
            catch (ArgumentNullException ae)
            {
                tbFactuurnummer.Text = 100 + "";
            }
            catch (FormatException fe) { }
        }

        private void btRegistreerFactuur_Click(object sender, EventArgs e)
        {
            if (validateFactuur(dgvNieuweDetails) && tbFactuurnummer.Text.Length>1 && this.isKlantGeselecteerd())
            {
                int klantID = Int32.Parse(dgvKlanten.SelectedRows[0].Cells[0].Value.ToString());
                DateTime datum = dtpDate.Value;
                string factuurnummer = tbFactuurnummer.Text.ToString();
                string opmerkingen = tbOpmerkingen.Text.ToString();
                int.Parse(factuurnummer);

                int aantalFactuurDetails = dgvNieuweDetails.Rows.Count - 1;
                string artikelNaam = "";
                float prijs = 0;
                byte btw = 0;
                List<FactuurDetail> fds = new List<FactuurDetail>();
                for (int i = 0; i < aantalFactuurDetails; i++)
                {
                    artikelNaam = dgvNieuweDetails.Rows[i].Cells[0].Value.ToString();
                    prijs = float.Parse(dgvNieuweDetails.Rows[i].Cells[1].Value.ToString());
                    btw = byte.Parse(dgvNieuweDetails.Rows[i].Cells[2].Value.ToString());
                    FactuurDetail fd = new FactuurDetail();
                    fd.artikelNaam = artikelNaam;
                    fd.prijs = Math.Round(prijs,2);
                    fd.btw = (byte)btw;
                    fds.Add(fd);
                }
                try
                {
                    databaseRepository.insertFactuur(klantID, factuurnummer, datum, opmerkingen, fds);
                    to.VulKlanten();
                    this.Close();
                }
                catch (FormatException)
                {
                    MessageBox.Show("Gelieve een getal als factuurnummer in te geven", "Factuurnummer onjuist");
                }
                catch (SqlException)
                {
                    MessageBox.Show("Factuurnummer bestaat al in de database", "Toevoegen Mislukt");
                }
            }
            else {
                MessageBox.Show("Controlleer of u alle velden correct hebt ingevuld","FOUT");
            }
        }

        private void btNieuweKlant_Click(object sender, EventArgs e)
        {
            new NieuweKlant(this).Show();
        }

        private void tbSearch_TextChanged(object sender, EventArgs e)
        {
            loadDGVKlanten(tbSearch.Text.ToString());
        }

        private void btAnnuleer_Click(object sender, EventArgs e)
        {
            to.VulKlanten();
            this.Close();
        }

        public void updateKlanten()
        {
            loadDGVKlanten(null);
            to.VulKlanten();
        }

        public void genereerTotaal()
        {
            float totaal = 0;
            float totaal2 = 0;
            for (int i = 0; i < dgvNieuweDetails.Rows.Count-1; i++)
            {
                totaal += float.Parse(dgvNieuweDetails.Rows[i].Cells[1].Value.ToString());
                totaal2 += float.Parse(dgvNieuweDetails.Rows[i].Cells[1].Value.ToString()) * ((float.Parse(dgvNieuweDetails.Rows[i].Cells[2].Value.ToString()) / 100) + 1);
            }
            txtTotaal.Text = "€ " + NieuweFactuur.formatFloat(totaal);
            txtBtw.Text = "€ " + NieuweFactuur.formatFloat(totaal2);
        }

        private static string formatFloat(double num) {
            return String.Format("{0:0.00}", num);
        }

        private void dgvNieuweDetails_RowValidated(object sender, DataGridViewCellEventArgs e)
        {
            genereerTotaal();
        }

        private void dgvNieuweDetails_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
        {
            // standaardvalidatie
            if (!(valideerView((DataGridView)sender, e.RowIndex))){
                e.Cancel = true;
            }
        }

        public bool valideerView(DataGridView dgv,int rij) {
            dgv.Rows[rij].Cells[1].Style.BackColor = Color.White;
            if (dgv.Rows[rij].Cells[0].Value != null || dgv.Rows[rij].Cells[1].Value != null || dgv.Rows[rij].Cells[2].Value != null)
            {
                if (dgv.Rows[rij].Cells[0].Value == null || dgv.Rows[rij].Cells[1].Value == null || dgv.Rows[rij].Cells[2].Value == null)
                {
                    return false;
                }
                else
                {
                    try
                    {
                        float.Parse(dgv.Rows[rij].Cells[1].Value.ToString());
                    }
                    catch (Exception)
                    {
                        dgv.Rows[rij].Cells[1].Style.BackColor = Color.Red;
                        return false;
                    }
                }
            }
            return true;
        }

        public bool validateFactuur(DataGridView dgv) {
            int aantal = dgv.Rows.Count;
            if (aantal < 2) {
                return false;
            }
            for (int i = 0; i < aantal; i++)
            {
                if (!(valideerView(dgv, i))) {
                    return false;
                }
            }
            return true;
        }

        public bool isKlantGeselecteerd() {
            try
            {
                Int32.Parse(dgvKlanten.SelectedRows[0].Cells[0].Value.ToString());
            }
            catch (Exception) {
                return false;
            }
            return true;
        }

        /// <summary>
        /// Opent NieuweKlant met de data van de geselecteerde Klant ingevuld.
        /// </summary>
        private void btEditKlant_Click(object sender, EventArgs e)
        {
            if (dgvKlanten.SelectedRows.Count == 1)
            {
                int klantID = Int32.Parse(dgvKlanten.SelectedRows[0].Cells[0].Value.ToString());
                new NieuweKlant(this, klantID).Show();
            }
            else
            {
                MessageBox.Show("Gelieve één klant te selecteren.");
            }
        }
    }
}